package br.com.divulgaqui.service;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.logging.Logger;

import br.com.divulgaqui.client.CategoriaServiceBeanLocal;
import br.com.divulgaqui.client.CategoriaServiceBeanRemote;
import br.com.divulgaqui.client.exception.EntityIgualException;
import br.com.divulgaqui.entity.Categoria;
import br.com.divulgaqui.persistence.dao.CategoriaDAO;
import br.com.divulgaqui.persistence.daoimpl.CategoriaDAOImpl;

/**
 * Session Bean implementation class CategoriaServiceBean
 */
@Stateless
public class CategoriaServiceBean implements CategoriaServiceBeanRemote, CategoriaServiceBeanLocal {

	@PersistenceContext
	private EntityManager entityManager;
	private CategoriaDAO categoriaDAO;
	private Logger logg = Logger.getLogger(CategoriaServiceBean.class);
	
    /**
     * Default constructor. 
     */
    public CategoriaServiceBean() {     	
    }
    
    @PostConstruct
    public void init(){    	
    	this.categoriaDAO = new CategoriaDAOImpl(this.entityManager);
    }

	@Override
	public void salvar(Categoria categoria) throws EntityIgualException{	
		Long id = categoria.getId() == null ? 0 : categoria.getId();
		Categoria cat = this.categoriaDAO.pesquisarCategoriaPorNome(id,categoria.getNome());
		if(cat == null){
			this.categoriaDAO.salvar(categoria);
		}else{
			logg.warn("Categoria \""+categoria.getNome()+"\" já foi cadastrada");
			throw new EntityIgualException();
		}				
	}

	@Override
	public void atualizar(Categoria categoria) throws EntityIgualException{
		Long id = categoria.getId() == null ? 0 : categoria.getId();
		Categoria cat = this.categoriaDAO.pesquisarCategoriaPorNome(id,categoria.getNome());
		if(cat == null){
			this.categoriaDAO.atualizar(categoria);		
		}else{
			logg.warn("Categoria \""+categoria.getNome()+"\" já foi cadastrada");
			throw new EntityIgualException();
		}	
	}
	
	@Override
	public List<Categoria> listar() {		
		return this.categoriaDAO.listar();		
	}

	@Override
	public List<Categoria> listarSubsParentes(Long idParente) {
		return this.categoriaDAO.listarSubsParentes(idParente);
	}

	@Override
	public List<Categoria> listarCategorias() {
		return this.categoriaDAO.listarCategorias();
	}

	@Override
	public List<Categoria> listarCategoriasInativas() {		
		return this.categoriaDAO.listarCategoriasInativas();
	}

	@Override
	public List<Categoria> listarCategoriasNivel3() {
		List<Categoria> categorias = this.categoriaDAO.listarCategoriasNivel2();
		List<Categoria> nivel3 = new ArrayList<Categoria>();
		for(Categoria categoria : categorias){
			nivel3.addAll(categoria.getSubsParentes());
		}
		return nivel3;
	}

	@Override
	public List<Categoria> qtdProdutosPorCategoriaNivel3(Boolean ativa) {		
		return this.categoriaDAO.qtdProdutosPorCategoriaNivel3(ativa);
	}

	@Override
	public List<Categoria> listarCategoriaPorNivel(Integer nivel) {		
		return this.categoriaDAO.listarCategoriaPorNivel(nivel);
	}
}
